迁移

第一阶段:旧服务器(数据打包)

写好了备份脚本,迁移就非常简单了。

1. 执行 Docker 备份脚本

/opt/backup_docker.sh 是迁移神器

# 手动运行一次备份,确保是最新的数据
sudo /opt/backup_docker.sh

Bash

# 手动运行一次备份,确保是最新的数据
sudo /opt/backup_docker.sh

执行完后, docker_docker_backup_xxx.tar.gz 里面已经包含了:

  • /opt/stacks (Dockge 配置)
  • /opt/dockge (Dockge 本身)
  • /opt/docker_data (所有应用的数据:Mysql, Trilium, Nginx, etc.)

2. 备份宿主机的“非 Docker”配置(关键!)

因为 Cloudflared 和 EasyTier 是直接装在系统里的,这些不在上面的备份包里。需要手动记下或备份以下内容:

  1. EasyTier 的启动参数:

    • 需要保留Network Secret (组网密码)
    • 需要保留 虚拟 IP (10.10.10.1)
    • 操作: 备份 /etc/systemd/system/easytier.service 文件。
    cp /etc/systemd/system/easytier.service /root/easytier.service.bak
    
  2. Cloudflare Tunnel 的 Token:

    • 虽然在 Cloudflare 后台能看到,但最好把那个 sudo cloudflared service install eyJ... 的长命令记在一个记事本里。
  3. 看门狗脚本:

    • 别忘了 /opt/check_tunnel.sh
    cp /opt/check_tunnel.sh /root/
    
  4. 打包带走: 把上面这些零散文件打包,或者直接复制内容到本地笔记里。

第二阶段:新服务器(恢复环境)

阶段目标

将旧服务器的数据完整迁移至新服务器,并将核心网络层 (EasyTier + Cloudflare) 容器化,实现“解压即用”的快速部署。


第一步:基础环境初始化

连上新服务器 SSH,执行以下操作。

1. 更换系统源 (阿里云)

bash <(curl -sSL https://linuxmirrors.cn/main.sh) --<span class="hljs-built_in">source</span> aliyun

2. 安装 Docker 使用 TUI 界面安装,更稳妥。

bash <(curl -sSL https://linuxmirrors.cn/docker.sh)
# 安装完成后检查
docker --version

3. 配置 Docker 镜像加速 (关键) 为了防止拉取镜像超时,配置国内加速源。

mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<<span class="hljs-string">EOF
{
  "registry-mirrors": [
    "https://docker.1panel.live",
    "https://docker.m.daocloud.io",
    "https://docker.1panel.dev",
    "https://docker.juewuy.com"
  ]
}
EOF</span>

<span class="hljs-comment"># 重启 Docker 生效</span>
systemctl daemon-reload
systemctl restart docker

4. 校准服务器时区 (可选但推荐)

sudo timedatectl set-timezone Asia/Shanghai

第二步:数据恢复

1. 上传备份 使用 SSH 工具将 docker_backup_xxxx.tar.gz 上传至 /root 目录。

2. 解压归位

# -C / 表示解压到根目录,自动还原到 /opt/dockge 等路径
tar -xzf docker_backup_*.tar.gz -C /

# 验证数据是否回来
ls /opt
7-Blog/网络与自托管/基于 NAT VPS 的全 Docker 化部署方案/assets/image-b0ea5be7

第三步:启动管理面板 (Dockge)

数据归位后,先启动面板。

cd /opt/dockge
docker compose up -d

开启nat转发

7-Blog/网络与自托管/基于 NAT VPS 的全 Docker 化部署方案/assets/image-15b7d33e

访问http://202.189.7.62:20113 进入管理页面


第四步:部署网络核心 (Network Core)

这是迁移的重头戏,把 EasyTier 和 Cloudflare 跑在 Docker 里。

1. 创建 Stack

  • Dockge 左上角 -> + Compose
  • Name: network-core

2. 粘贴配置

version: "3.8"
services:
  # --- EasyTier (组网核心) ---
  easytier:
    image: easytier/easytier:latest
    container_name: easytier
    hostname: easytier-vps
    restart: always
    # 【关键】使用 Host 模式,性能最好,且不需要映射端口
    network_mode: host
    # VPN 需要网络管理权限
    privileged: true
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun
    # 启动命令:指定 IP (10.10.10.1) 和 密码
    command: -i 10.10.10.1 --network-secret zw200495

  # --- Cloudflared (公网入口) ---
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: always
    # 【关键】Host 模式,直通本机 localhost:5001
    network_mode: host
    # ⚠️【请修改】填入 Cloudflare Tunnel Token
    command: tunnel run --token <你的Token>

3. 部署与验证

  • 点击 Deploy
  • 等待日志出现 Registered tunnel connection
  • 验证: 访问 https://docker.hxnppll.top,如果能打开 Dockge,说明公网通了。

第五步:客户端适配 (Windows)

因为更换了 VPS,NAT 映射的端口变了,需要更新家里电脑的连接信息。

1. 获取新端口 在 VPS 后台查看 NAT 转发:内部 11010 -> 外部 ????? (例如 35000)。

2. 修改 Windows EasyTier 配置

[[peer]]
# 修改为新 IP 和新端口
uri = "udp://202.189.7.62:35000"

3. 重启 Windows EasyTier 并尝试 ping 10.10.10.1


第六步:复活业务与修正配置 (补漏)

1. 修正镜像策略 旧备份的 Stack 可能含有 pull_policy: never。在新服务器上会导致启动失败。

  • 在 Dockge 中编辑其他 Stacks (如 Nginx, Trilium)。
  • 删除 pull_policy: never 这一行。
  • 点击 Deploy (让它自动从新配置的阿里云源拉取镜像)。

2. 启动所有服务

  • 逐个启动 filebrowser, uptime-kuma 等所有业务容器。

第七步:恢复自动化脚本

由于架构变更为 Docker,旧脚本已失效,需重写。

1. 升级版看门狗 (check_tunnel.sh)

cat > /opt/check_tunnel.sh <<<span class="hljs-string">EOF
#!/bin/bash
TEST_URL="https://docker.hxnppll.top"
LOG_FILE="/var/log/tunnel_watchdog.log"
NOW=\$(date +"%Y-%m-%d %H:%M:%S")

HTTP_CODE=\$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "\$TEST_URL")

if [ "\$HTTP_CODE" == "000" ] || [ "\$HTTP_CODE" == "502" ] || [ "\$HTTP_CODE" == "503" ] || [ "\$HTTP_CODE" == "530" ]; then
    echo "[\$NOW] ⚠️ 故障 (代码: \$HTTP_CODE),重启 Cloudflared 容器..." >> \$LOG_FILE
    # 重启 Docker 容器
    docker restart cloudflared
else
    :
fi
EOF</span>
chmod +x /opt/check_tunnel.sh

2. 恢复备份脚本 (backup_docker.sh)

cat > /opt/backup_docker.sh <<<span class="hljs-string">EOF
#!/bin/bash
BACKUP_DIR="/opt/backup"
DATE=\$(date +%Y%m%d)
FILENAME="docker_backup_\$DATE.tar.gz"

mkdir -p \$BACKUP_DIR
echo "[\$(date)] 开始备份..."
tar -czf \$BACKUP_DIR/\$FILENAME /opt/stacks /opt/dockge /opt/docker_data
echo "[\$(date)] 备份完成: \$FILENAME"

# 清理 7 天前旧备份
find \$BACKUP_DIR -name "docker_backup_*.tar.gz" -mtime +7 -exec rm {} \;
EOF</span>
chmod +x /opt/backup_docker.sh

3. 写入定时任务

crontab -e

添加:

*/5 * * * * /opt/check_tunnel.sh
0 3 * * * /opt/backup_docker.sh
0 4 * * 0 docker system prune -af --volumes > /dev/null 2>&1

🎉 迁移完成!